package com.hyts.mvc.boot;

import com.hyts.guava.object.Objects;
import com.hyts.mvc.annotation.MvcBootApplication;
import com.hyts.mvc.annotation.MvcScan;
import com.hyts.mvc.boot.war.MvcWarTargetPointer;
import com.hyts.mvc.context.WebMvcContext;
import sun.misc.Launcher;

/**
 * project-name:coffice-toolbox
 * package-name:com.hyts.mvc.boot
 * author:Libo/Alex
 * create-date:2019-06-16 18:11
 * copyright:libo-hyts-github
 * email:libo2dev@aliyun.com
 * description:此类主要用于: 初始化启动组件
 */
abstract class BootApplication extends MvcWarTargetPointer{

    /**
     * 是否初始化
     */
    volatile static boolean inited = false;

    /**
     * 操作初始化功能的实现
     * @return
     */
    static boolean inited(){
        return inited;
    }

    /**
     * 运行服务
     * @param clazz
     * @param args
     */
    public void run(String[] args,Class<?> clazz){
        //mvc扫描服务获取注解
        MvcBootApplication mvcScan = clazz.getAnnotation(MvcBootApplication.class);
        //扫描判断
        if(mvcScan == null){
            throw new IllegalStateException("请配置@MvcBootApplication注解才可以进行启动相关服务");
        }
        //获取基础package扫描包服务
        String [] basePackages = mvcScan.basePackages();
        if(Objects.nonNull(mvcScan.basePackages() )){
            basePackages = new String[]{clazz.getPackage().getName()};
        }
        WebMvcContext.setBootstrapMainClass(clazz);
        if(!inited()){
            laucher(args);
        }else{
            laucher(args);
        }
    }

    /**
     * 运行操作服务
     * @param clazz
     */
    public void run(Class<?> clazz) {
        run(null,clazz);
    }

    protected abstract void laucher();

    protected abstract void laucher(String[] args);

}
